﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Lesson21
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 值和引用类型
            // 如何判断 值类型和引用类型
            // F12进入类型内部去看： 是class就是引用类型，是struct就是值类型


            // 语句块
            // 命名空间
            //   ↓
            // 类、接口、结构体
            //   ↓
            // 属性、函数、索引器、运算符重载（类、接口、结构体）
            //   ↓
            // 条件分支、循环、异常处理、方法体

            // 上层语句块：类、接口、结构体
            // 中层语句块：函数
            // 下（底）层语句块：条件分支、循环

            // 逻辑代码写在 函数、条件分支、循环中

            // 变量在哪里声明？
            // 上、中、底都能声明变量
            // 上层：成员变量
            // 中、下层：临时（局部）变量

            // 变量生命周期
            // 编程时 大部分都是临时变量
            // 语句块执行结束，没有记录的对象将被回收或变成垃圾
            // 值类型：被系统自动回收
            // 引用类型：栈上用于存地址的房间被系统自动回收，堆中具体内容变成垃圾，待下次GC回收

            // 想要不被回收或不变成垃圾，必须将其记录下来
            // 如何记录？
            // 在更高层级记录或者使用静态全局变量记录

            // 结构体中的值和引用
            // 结构体本身是值类型
            // 前提：该结构体没有作为其他类的成员
            // 结构体中值，栈中存值的具体内容
            // 结构体中引用，栈中存地址，堆中存具体内容

            // 引用类型始终是存在堆中


            // 类中的值和引用
            // 类本身是引用类型
            // 在类中的值，栈中存地址，堆中存具体内容
            // 在类中的引用，栈中存地址，堆中存具体内容


            // 数组中的存储规则
            // 数组是引用类型
            // 值类型的数组，堆中房间存具体内容
            // 引用类型的数组，堆中房间存地址

            // 结构体继承接口
            // 利用里氏替换原则，用接口容器装载结构体存在装箱拆箱

        }
    }
}
